home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / asm / alib11b.zip / CODE1.ZIP / DISPGRAP / FONTLOAD.ASM < prev    next >
Assembly Source File  |  1991-11-04  |  7KB  |  173 lines

  1. ; load.asm -- program to read font file and throw into Planes 2 and 3 of the Vga
  2. ; This'll work for EGA as well.
  3. ; This is for font bigger than 8 pixels wide
  4. ;the data
  5. ;the program
  6. vga_segment         equ       0a000h    ;display memory segment
  7. sc_index            equ       3c4h      ;sequence controller
  8. map_mask            equ       2         ;map mask (sc)
  9. ; data segment starts here
  10. data       segment                       ; define data segment
  11. nambuff    db        '(font name goes here)',0       ; maximum bytes
  12. databuff   db        16386 dup (?)        ; data buffer
  13. data       ends
  14. ; -----------------------------
  15. code     segment
  16. main      proc      far
  17.          assume cs:code,ds:data,es:data ;all segments set to code segment
  18. start:
  19. ; set up stack for return
  20.            push      ds
  21.            sub       ax,ax
  22.            push      ax
  23. ; set ds to data segment
  24.           mov       ax,data
  25.           mov       ds,ax
  26. ;point es to display memory for the rest of the program
  27. ;
  28.           mov       ax,vga_segment
  29.           mov       es,ax
  30.           sub       di,di               ; di = address 0 in display memory
  31. ; Stuff font bit patterns into planes 2 and 3
  32. ;                port   reg     val
  33. ; modec   dw      3c4h,   2,      1100b   ; map mask  (enable maps 2 and 3)
  34. ;         dw      3c4h,   4,      7       ; memory mode  (bitmap or serial)
  35. ;         dw      3ceh,   5,      0       ; mode register  (bitmap or serial)
  36. ;         dw      3ceh,   6,      4       ; miscellaneous  (seg = A000h)
  37.           mov       dx,3c4h             ; map mask
  38.           mov       al,2
  39.           out       dx,al
  40.           inc       dx
  41.           mov       al,1100b            ; enable maps 2 and 3
  42.           out       dx,al
  43.           dec       dx
  44.           mov       al,4                ; memory mode
  45.           out       dx,al
  46.           inc       dx
  47.           mov       al,7                ; bitmap mode
  48.           out       dx,al
  49.           mov       dx,3ceh
  50.           mov       al,5                ; graphics mode
  51.           out       dx,al
  52.           inc       dx
  53.           mov       al,0
  54.           out       dx,al
  55.           dec       dx
  56.           mov       al,6                ; graphics miscellaneous
  57.           out       dx,al
  58.           inc       dx
  59.           mov       al,4
  60.           out       dx,al
  61.           dec       dx
  62. ; the funny thing about this program is that you can load the font bit patterns
  63. ; into the B000 segment instead of the A000 segment and it seems to work.  This
  64. ; might be useful along with some dos extender program that wanted to use the
  65. ; A000 segment for extra DOS memory.  But if you load the bit patterns into 
  66. ; the B800 segment, it doesn't work.  Does anybody know why?
  67. ; open file
  68.           mov       dx,offset nambuff   ; address of name
  69.           mov       al,0                ; file open for reading
  70.           mov       ah,3dh              ; function to open file
  71.           int       21h                 ; call dos
  72.           mov       bx,ax               ; file handle in bx
  73. ;   (error routine deleted)
  74. ; read file
  75. newbuff:
  76.           mov       cx,16386             ; number of bytes to read
  77.           mov       dx,offset databuff  ; address of buffer
  78.           mov       ah,3fh              ; function to read file
  79.           int       21h                 ; call dos
  80. ;        mov       si,bx               ; save handle
  81. ;           mov       cx,ax               ; number of bytes read in cx
  82. ; the loading routine
  83. ; Sends first byte in data buffer to plane 2, address 0 in video buffer
  84. ; Sends second byte in data buffer to plane 3, address 0 in video buffer
  85. ; Sends third byte in data buffer to plane 2, address 1 in video buffer
  86. ; Sends fourth byte in data buffer to plane 3, address 1 in video buffer
  87. ; tra la la la la,  etc.
  88. ; set count
  89.          mov       cx,8194              ; number of bytes to read/2
  90. ;point routine at data buffer
  91.           mov       bx,offset databuff  ; address of buffer
  92. ;select the plane that this object will be drawn in.
  93. loopit:
  94.           mov       dx,sc_index         ; point to sequencer index register
  95.           mov       ah,4                ; select plane 2 (0100b)  
  96.           mov       al,map_mask         ; map mask address register
  97.           out       dx,ax               ; send it
  98. ; get the byte in ah, send to plane 2
  99.           mov       ah,[bx]             ; get character
  100.           mov       es:[di],ah          ; move into memory location 
  101. ; flip to the next plane
  102.           mov       dx,sc_index         ; point to sequencer index register
  103.           mov       ah,8                ; select plane 3 (1000b)
  104.           mov       al,map_mask         ; map mask address register
  105.           out       dx,ax               ; send it
  106. ; get the byte in ah, send to plane 3
  107.           inc       bx                  ; point to next byte in data buffer
  108.           mov       ah,[bx]
  109.           mov       es:[di],ah     ;move into memory location
  110. ; loop until done
  111.           inc       bx                  ; point to next byte in data buffer
  112.           inc       di                  ; point to next address in video buffer
  113.           loop      loopit
  114. ;        close file
  115.         mov     ah,3eh
  116.         int     21h
  117.  
  118. ;        reset VGA to text mode.  Forget about BIOS, that resets everything
  119. ;   You're basically changing it to odd-even mode and changing the video segment.
  120. ; Read Ferraro's book on the EGA/VGA if you don't understand.
  121. ; mode3   dw      3c4h,   2,      3       ; map mask  (enable map 0/1)
  122. ;         dw      3c4h,   4,      3       ; memory mode  (odd/even)
  123. ;         dw      3ceh,   5,      10h     ; mode register  (odd/even)
  124. ;         dw      3ceh,   6,      0eh     ; miscellaneous  (seg = B800)
  125.           mov       dx,3c4h             ; map mask
  126.           mov       al,2
  127.           out       dx,al
  128.           inc       dx
  129.           mov       al,3            ; enable maps 2 and 3
  130.           out       dx,al
  131.           dec       dx
  132.           mov       al,4                ; memory mode
  133.           out       dx,al
  134.           inc       dx
  135.           mov       al,3                ; odd-even
  136.           out       dx,al
  137.           mov       dx,3ceh
  138.           mov       al,5                ; graphics mode
  139.           out       dx,al
  140.           inc       dx
  141.           mov       al,10h              ; odd/even
  142.           out       dx,al
  143.           dec       dx
  144.           mov       al,6                ; graphics miscellaneous
  145.           out       dx,al
  146.           inc       dx
  147.           mov       al,0eh
  148.           out       dx,al
  149.           dec       dx
  150. ; set block specifier to 0, you could set it to something else too,
  151. ; but I haven't been using multiple fonts
  152.           mov       ax,1103h
  153.           mov       bl,0
  154.           int       10h                 
  155. ; clear screen
  156.         push    es
  157.         push    di
  158.         push    cx
  159.  
  160.         mov     ax,720h         ;   clear screen to spaces
  161.         mov     cx,39 * 100     ; this routine isn't really necessary
  162.         rep     stosw
  163.  
  164.         pop     cx
  165.         pop     di
  166.         pop     es
  167.         mov     ax,1h                   ; I forget why I did this
  168.           ret                           ; return to Dos
  169. main      endp                          ; end of main program
  170. code     ends
  171.          end       start
  172.  
  173.